/**
   QiniuuTTIL
 * Time:2018年6月26日
 */
package com.ssm.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import org.springframework.web.multipart.MultipartFile;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;


public class QiniuTestUtil{
	private	String accessKey = "UbVbfI8i248_obks5feHmOH1vNO3vAtH5t8EUyfu";
	private	String secretKey = "XAh79uf5dHrq7SlZOMZK0uAgax_HOY9HfkzY2ByT";
	private	String bucket = "myresource";
	/**
	 * @author 15199
	 *华东	Zone.zone0()
	     华北	Zone.zone1()
	     华南	Zone.zone2()
	     北美	Zone.zoneNa0()
	      文件上传
	 * @return 
	 * @throws UnsupportedEncodingException 
	 */	
	public static void main(String[] args) throws UnsupportedEncodingException {
		QiniuTestUtil qiniuTestUtil=new QiniuTestUtil();
		qiniuTestUtil.downLoad("柒个我");

	}


	/*数据流上传*/
	public Map<String,String> uploadFiles(String filename,MultipartFile file) throws IOException{
		//构造一个带指定Zone对象的配置类
		Configuration cfg = new Configuration(Zone.zone0());
		//...其他参数参考类注释
		UploadManager uploadManager = new UploadManager(cfg);
		//		//...生成上传凭证，然后准备上传
		//		String accessKey = "UbVbfI8i248_obks5feHmOH1vNO3vAtH5t8EUyfu";
		//		String secretKey = "XAh79uf5dHrq7SlZOMZK0uAgax_HOY9HfkzY2ByT";
		//		String bucket = "myresource";
		//默认不指定key的情况下，以文件内容的hash值作为文件名
		String key =filename;
		try {
			byte[] uploadBytes = file.getBytes();
			ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
			Auth auth = Auth.create(accessKey, secretKey);
			String upToken = auth.uploadToken(bucket);
			try {
				Response response = uploadManager.put(byteInputStream,key,upToken,null, null);
				//解析上传成功的结果
				DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

				Map<String,String> map=new HashMap<String,String>();

				map.put(putRet.hash,putRet.key);

				return map;

			} catch (QiniuException ex) {
				Response r = ex.response;
				System.err.println(r.toString());
				try {
					System.err.println(r.bodyString());
				} catch (QiniuException ex2) {
					//ignore
				}
			}
		} catch (UnsupportedEncodingException ex) {
			//ignore
		}
		return null;
	}
	/*文件下载*/
	/*这里我的理解是拼接出路径   实际使用可用数据库储存文件名 在此方法中拼接路径 在前端src中可直接访问此下载路径中的文件*/
	public String downLoad(String filename) throws UnsupportedEncodingException{
		/*需要下载的文件名*/
		String fileName = filename+".mp4";
		/*此处为测试网址*/
		String domainOfBucket = "pawrl25jn.bkt.clouddn.com";

		String encodedFileName = URLEncoder.encode(fileName, "utf-8");

		String finalUrl = String.format("%s/%s", domainOfBucket, encodedFileName);

		return finalUrl;	
	}

	/*获取空间文件列表*/
	public void getFilelist(){
		//构造一个带指定Zone对象的配置类
		Configuration cfg = new Configuration(Zone.zone0());
		//...其他参数参考类注释
		Auth auth = Auth.create(accessKey, secretKey);
		BucketManager bucketManager = new BucketManager(auth, cfg);
		//文件名前缀
		String prefix = "";
		//每次迭代的长度限制，最大1000，推荐值 1000
		int limit = 1000;
		//指定目录分隔符，列出所有公共前缀（模拟列出目录效果）。缺省值为空字符串
		String delimiter = "";
		//列举空间文件列表
		BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);
		while (fileListIterator.hasNext()) {
			//处理获取的file list结果
			FileInfo[] items = fileListIterator.next();
			for (FileInfo item : items) {
				System.out.println("************************");
				//		    	 类型：数组 
				//		    	key 是 资源名。
				System.out.println(item.key);
				//		    	 类型：数字 
				//		    	hash 是 文件的HASH值，使用hash值算法计算。
				System.out.println(item.hash);
				//		    	 类型：字符串 
				//		    	fsize 是 资源内容的大小，单位：字节。
				System.out.println(item.fsize);
				//		    	 类型：数字 
				//		    	mimeType 是 资源的 MIME 类型。
				System.out.println(item.mimeType);
				//		    	 类型：字符串 
				//		    	putTime 是 上传时间，单位：100纳秒，其值去掉低七位即为Unix时间戳。		        
				System.out.println(item.putTime);
				//		    	 类型：字符串 
				//		    	endUser  资源内容的唯一属主标识，请参考上传策略 (PutPolicy)。
				System.out.println(item.endUser);
				System.out.println("************************");
			}
		}
	}



	public String getAccessKey() {
		return accessKey;
	}



	public void setAccessKey(String accessKey) {
		this.accessKey = accessKey;
	}



	public String getSecretKey() {
		return secretKey;
	}



	public void setSecretKey(String secretKey) {
		this.secretKey = secretKey;
	}



	public String getBucket() {
		return bucket;
	}



	public void setBucket(String bucket) {
		this.bucket = bucket;
	}







}
